package com.zyl.unsafe;

import java.util.*;
import java.util.concurrent.CopyOnWriteArraySet;

/**
 * @author zhaoyl
 * @date 2024/5/15 21:50
 * @description 说明
 * set 多线程安全问题
 * HashSet 底层是HashMap;
 *     add set 本质就是map 添加 key 是无法重复的
 */
//java.util.ConcurrentModificationException  并发修改异常
public class SetTest {
    public static void main(String[] args) {
       // HashSet 多线程不安全
        //Set<String> set = new HashSet<>();

        /* 解决方案1
        *Java.util.Collections类的 synchronizedSet() 方法用于返回由指定集合支持的同步（线程安全）集合。
        * 为了确保串行访问，所有对支持集合的访问都必须通过返回的集合进行。
        * */
       // Set<String> set = Collections.synchronizedSet(new HashSet<>());

        /*
        * 解决方案2 读写分离
        * CopyOnWriteArraySet
         * */
        Set<String> set = new CopyOnWriteArraySet<>();
        //开10个线程添加
        for (int i=0;i<=10;i++){
            new Thread(()->{
                set.add(UUID.randomUUID().toString().substring(0,5));
                System.out.println(set);
            },String.valueOf(i)).start();
        }
    }
}
